//
//  main.swift
//  12协议和类方法中的Self
//
//  Created by 左忠飞 on 2021/8/13.
//

import Foundation

protocol Copyable {
    
    //这里的返回值类型Self,表示继承这个协议的类型,以及子类
    func copy() -> Self
}

class MyClass:Copyable{
    var num = 1
    
    func copy() -> Self {
        //这里创建一个和调用方法的类型相同的类型,也可能是子类
        //所以这个类型必须把这里使用的init初始化方法标记为required,所有的子类也都实现了这个初始化方法,就可以正确的创建对象了
        let result = type(of: self).init()
        result.num = num
        return result
    }
    
    required init(){
        
    }
}

let object = MyClass()
object.num = 100

let newObject = object.copy()
object.num = 1

print(object.num)
print(newObject.num)
